package com.kaifamiao.set;

import java.time.LocalDate;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;

/**
 * 1、通常将自定义类型对象添加到 HashSet 或 作为 key 添加到 HashMap 时
 *    需要重写自定义类的 equals(Object) 和 hashCode()
 * 2、通常将自定义类型对象添加到 TreeSet 或 作为 key 添加到 TreeMap 时,
 *    要么让 自定义类 支持自然排序，
 *    要么在创建 TreeSet 或 TreeMap 时就显式指定比较器
 */
public class TestPanda {

    public static void main(String[] args) {

        Set<Panda> pandas = new HashSet<>();

        Panda p = new Panda( "大美", LocalDate.of(2019,10,10));
        // 将 Panda 实例添加到 HashSet 中时，会根据 Panda实例的 hashCode 确定其存放位置
        pandas.add( p );

        Panda a = new Panda( "小美", LocalDate.of(2020,11,30));
        // 将 Panda 实例添加到 HashSet 中时，会根据 Panda实例的 hashCode 确定其存放位置
        pandas.add( a );

        System.out.println( pandas );

        Panda d = new Panda( "小美", LocalDate.of(2020,11,30));
        // 将 Panda 实例添加到 HashSet 中时，会根据 Panda实例的 hashCode 确定其存放位置
        System.out.println( pandas.add( d ) );

        System.out.println( pandas );

        Comparator<Panda> comp = new Comparator<Panda>() {
            @Override
            public int compare(Panda a, Panda b) {
                LocalDate d1, d2;
                if (a != null && b != null &&
                        (d1 = a.getBirthdate()) != null &&
                        (d2 = b.getBirthdate() ) != null ) {
                    return d2.compareTo( d1 );
                }
                return 0;
            }
        };
        Set<Panda> ts = new TreeSet<>( comp );
        ts.add( p );
        ts.add( a );

        System.out.println( ts );

    }

}
